package main

import "fmt"

func test01(arr [3]int) {
	arr[0] = 88
}
func test02(arr *[3]int) {
	(*arr)[0] = 88
}
func main() {
	//1数组是多个相同类型数据的组合，一个数组中一旦声明/定义了，其长度是固定的，不能动态变化
	var arr01 [3]int
	arr01[0] = 1
	arr01[1] = 30
	fmt.Println(arr01)

	//2 var arr []int 这时arr就是一个slice切片，切片后面讲解

	//3数组中的元素可以是任何数据类型，包括值类型和引用类型，但是不能混用

	//4数组创建后，如果没有赋值，有默认值
	//数值类型数组：默认值为0
	//字符串数组：默认值为""
	//bool数组：默认值为false
	var arr0 [3]float32
	var arr1 [3]string
	var arr2 [3]bool
	fmt.Printf("arr0=%v arr1=%v arr2=%v\n", arr0, arr1, arr2)

	/*
		5使用数组的步骤
		(1)声明数组并开辟空间
		(2)给数组各个元素赋值
		(3)使用数组
	*/

	//6数组的下标是从0开始的

	//7数组下标必须在指定范围内使用，否则报panic：数组越界

	//8Go的数组属于值类型，在默认情况下是值传递，因此会进行值拷贝，数组间不会相互影响
	arr := [3]int{11, 22, 33}
	//test01开辟了一个栈，main是另一个栈，值传递只是将值进行拷贝过去
	test01(arr) //因为是值传递，所以不会改变arr[0]的值
	fmt.Println("arr=", arr)

	//9如想在其他函数中，去修改原来的数组，可以使用引用类型(指针方式)
	test02(&arr)
	fmt.Println("main arr=", arr)

	//10长度是数组类型的一部分，在传递函数参数时，需要考虑数组的长度
}
